package com.ruoyi.common.core.domain.entity;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import javax.validation.constraints.*;

import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.constant.SysUserCodeConstants;
import com.ruoyi.common.valid.VEdit;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.annotation.Excel.ColumnType;
import com.ruoyi.common.annotation.Excel.Type;
import com.ruoyi.common.annotation.Excels;
import com.ruoyi.common.core.domain.BaseEntity;

/**
 * 用户对象 sys_user
 *
 * @author ruoyi
 */
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
public class SysUser extends BaseEntity {
    private static final long serialVersionUID = 1L;

    /**
     * 用户ID
     */
    @Excel(name = "用户序号", cellType = ColumnType.NUMERIC, prompt = "用户编号")
    private Long userId;

    /**
     * 部门ID
     */
    @Excel(name = "部门编号", type = Type.IMPORT)
    private Long deptId;

    /**
     * 用户账号(登录账号)
     */
    @Excel(name = "登录名称")
    @NotNull(message = "用户账号不能为空")
    private String userName;

    @TableField(exist = false)
    private String userNameComplete;

    /**
     * 机构名称
     */
    @Excel(name = "机构名称")
    @NotNull(message = "机构名称不能为空")
    private String nickName;

    /**
     * 用户邮箱
     */
    @Excel(name = "用户邮箱")
    private String email;

    /**
     * 手机号码
     */
    @Excel(name = "手机号码")
    private String phonenumber;

    /**
     * 用户性别
     */
    @Excel(name = "用户性别", readConverterExp = "0=男,1=女,2=未知")
    private String sex;

    /**
     * 用户头像
     */
    private String avatar;

    /**
     * 密码
     */
    private String password;
    /**
     * 用以查看的，可加密解密的密码密文
     */
    private String passwordView;
    /**
     * 二次确认密码
     */
    @TableField(exist = false)
    private String rePassword;

    /**
     * 帐号状态（0正常 1停用）
     */
    @Excel(name = "帐号状态", readConverterExp = "0=正常,1=停用")
    private String status;

    /**
     * 删除标志（0代表存在 2代表删除）
     */
    private String delFlag;

    /**
     * 最后登录IP
     */
    @Excel(name = "最后登录IP", type = Type.EXPORT)
    private String loginIp;

    /**
     * 最后登录时间
     */
    @Excel(name = "最后登录时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Type.EXPORT)
    private Date loginDate;
    /**
     * 用户类型标签code 机构institution 协会association 企业enterprise
     */
    @NotNull(message = "用户类型不能为空")
    private String typeCode;

    /** 用户类型（00系统用户） */
    private String userType;
    @TableField(exist = false)
    private List<String> typeCodeList;
    /**
     * 社会统一信用代码
     */
    @NotNull(message = "社会统一信用代码不能为空")
    private String socialCode;
    /**
     * 机构代码(不允许重复)
     */
    @NotNull(message = "机构代码不能为空")
    private String organCode;

    /**
     * 联系人姓名
     */
    private String contactName;
    /**
     * 联系人手机号
     */
    private String contactPhone;
    /**
     * 地址
     */
    private String address;
    /**
     * 是否默认机构1是0否(只允许一个默认机构)
     * 只能设置一个，管理员录入学员的时候默认为该机构
     */
    private Integer defaultFlag;
    /**
     * 备注
     */
    private String remark;
    /**
     * 父级id，本表内主键id
     */
    private Long parentId;
    @TableField(exist = false)
    private String parentName;
    /**
     * 部门对象
     */
    @Excels({
            @Excel(name = "部门名称", targetAttr = "deptName", type = Type.EXPORT),
            @Excel(name = "部门负责人", targetAttr = "leader", type = Type.EXPORT)
    })
    private SysDept dept;

    /**
     * 角色对象
     */
    private List<SysRole> roles;

    /**
     * 角色组
     */
    @NotNull(message = "角色id不允许为空", groups = {VEdit.class})
    private Long[] roleIds;

    /**
     * 岗位组
     */
    private Long[] postIds;

    /**
     * 角色ID
     */
    private Long roleId;
    /**
     * 企业数量
     */
    @TableField(exist = false)
    private Long entNum;
    /**
     * 有效学员数量
     */
    @TableField(exist = false)
    private Long studentNum;
    /**
     * 缴费金额（机构=批次总金额，企业=学员单价合计）
     */
    @TableField(exist = false)
    private BigDecimal payPriceSum;
    /**
     * 到期日期（学员最晚到期日期）
     */
    @TableField(exist = false)
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date lineDate;

    @TableField(exist = false)
    private List<Long> userIdList;

    /**
     * 父级id列表
     */
    @TableField(exist = false)
    private List<Long> parentIdList;
    /**
     * 子节点
     */
    @TableField(exist = false)
    private List<SysUser> children;

    /**
     * 校验数据类型 1社会统一信用代码 2.机构代码 3.登录账号
     */
    @TableField(exist = false)
    private String verifyType;


    /**
     * 查询开始~结束时间
     */
    @TableField(exist = false)
    private Date startDate;

    @TableField(exist = false)
    private Date endDate;

    /** 培训回调地址 */
    private String trainCallBackApi;

    /** 原系统id */
    private Long origSysId;

    public boolean isAdmin() {
        return isAdmin(this.userId);
    }

    public static boolean isAdmin(Long userId) {
        return userId != null && 1L == userId;
    }

    /**
     * 判断typeCode是否是管理员
     *
     * @param typeCode type code
     * @return boolean
     */
    public static boolean isAdminTypeCode(String typeCode) {
        return SysUserCodeConstants.UserCode.ADMIN.getCode().equals(typeCode);
    }

}
